package JavaConfiguration;


//项目的配置lei

//第一步:@Configuration,表明这是一个配置类
//第二步:@ComponentScan,表明扫描包,()中不加大括号是加一个包，加大括号可以加多个包中间用,隔开
//@PropertySource是加外部配置文件


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@ComponentScan({"com.cty.ioc_01"})
@PropertySource("classpath:jdbc.properties")
@Configuration
public class javaConfiguration {

    //第一种加参数的方式

    @Value("${url}")//加入组件类中的信息
    String url;

    @Value("${driver}")
    String driver;


    @Value("${user}")
    String user;

    @Value("${password}")
    String password;
    /*第三方类的配置
    * 返回值：是目标对象的类，父类或者接口
    * 方法名:就是bean标签中的id
    * 在该方法中创建对象并返回
    * 最后也是最重要的一步加@Bean注解
    * 第二种:加参数的方式:如果参数只在方法内部使用的话，只需要传入形参，在形参的前面加上@Value注解
    *
    * 问题1:beanId的设置 默认:是方法的名字
    *       在@Bean加入name指定beanId
    *
    * 问题2:在组件中引入其他组件对象
    *
    * 问题三:周期方法的设置
    *   方案一:在组件类中加入初始方法和销毁方法: @PostConstruct 和 @PreDestroy注解
    *   方案二:在Bean注解的括号中加入initMethod 和 destroyMethod 去指定销毁和初始方法
    * 问题四:作用域的设置
    *   方案一:在组件类中加@Scope注解
    *   方案二:在配置方法中加@Scope注解
    * */
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)//默认单例模式
    @Bean(name = "ergouzi",initMethod = "",destroyMethod = "")
    public DruidDataSource dataSource1() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }


    @Bean(name = "lvdanzi")
    public DruidDataSource dataSource2() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate1() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //方案一:直接调用其他组件的方法(不推荐)注意:该方法必须也是一个组件有@Bean注解
        jdbcTemplate.setDataSource(dataSource1());

        return jdbcTemplate;
    }

    @Bean
    public JdbcTemplate jdbcTemplate2(DataSource lvdanzi) {//推荐
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //方案二:直接传入形参
        //单例情况:直接传入即可
        //多例情况:形参名 写成id名即可
        //没有该组件:报异常
        jdbcTemplate.setDataSource(lvdanzi);

        return jdbcTemplate;
    }
}
